- Vue d'ensemble (Overview)
- Automatisation de l'interface utilisateur
- UI-ANA-016 - Extraire l'URL ouverte du navigateur
- UI-ANA-017 - ContinuerSurErreur (ContinueOnError) True
- UI-ANA-018 - Répertorier les activités d'OCR/d'image
- UI-DBP-006 - Utilisation du conteneur
- UI-DBP-013 - Utilisation abusive de l’automatisation Excel
- UI-DBP-030 - Utilisation de variables interdites dans les sélecteurs
- ST-DBP-021 - Délai d'expiration codé en dur
- UI-PRR-001 - Simuler un clic
- UI-PRR-002 - Type de simulation
- UI-PRR-003 - Ouverture d'une utilisation abusive de l'application
- UI-PRR-004 - Délais codés en dur
- UI-REL-001 - Idx volumineux dans les sélecteurs
- UI-SEC-004 - Données d’e-mail du sélecteur
- UI-SEC-010 - Restrictions d'applications/d'URL
- UI-USG-011 - Attributs non autorisés
- SY-USG-013 - Invocation de fichier privé
- SY-USG-014 - Espaces réservés de modèle d'exécution incorrects
- Applications et technologies automatisées avec UI Automation
- Outil de migration de navigateur UiPath
- Enregistreur de Computer Vision
- Cliquer (Click)
- Pointer (Hover)
- Saisir un texte sécurisé (Type Secure Text)
- Envoyer le raccourci (Send Hotkey)
- Saisir dans (Type Into)
- Vérifier (Check)
- Sélectionner l'élément (Select Item)
- Sélectionner plusieurs éléments (Select Multiple Items)
- Obtenir le texte (Get Text)
- Définir le texte (Set Text)
- Activer (Activate)
- Mettre en surbrillance (Highlight)
- Définir le focus (Set Focus)
- Base d'ancrage (Anchor Base)
- Context Aware Anchor
- Rechercher l'élément relatif (Find Relative Element)
- Indiquer sur l'écran (Indicate On Screen)
- Élément existant (Element Exists)
- Rechercher l'élément (Find Element)
- Attendre que l'élément disparaisse (Wait Element Vanish)
- Rechercher les enfants (Find Children)
- Obtenir l'ancêtre (Get Ancestor)
- Étendue de l'élément (Element Scope)
- Obtenir l'attribut (Get Attribute)
- Définir la zone de détourage (Set Clipping Region)
- Obtenir la position (Get Position)
- Prendre une capture d'écran (Take Screenshot)
- Attendre un attribut (Wait Attribute)
- Sur affichage de l'élément (On Element Appear)
- Sur disparition de l'élément (On Element Vanish)
- Cliquer sur le texte (Click Text)
- Pointer sur le texte (Hover Text)
- Rechercher la position du texte (Find Text Position)
- Obtenir le texte complet (Get Full Text)
- Obtenir le texte visible (Get Visible Text)
- Extraire les données structurées (Extract Structured Data)
- Texte existant (Text Exists)
- Cliquer sur le texte OCR (Click OCR Text)
- Pointer sur le texte OCR (Hover OCR Text)
- Obtenir le texte OCR (Get OCR Text)
- Rechercher une position de texte OCR (Find OCR Text Position)
- Reconnaissance optique des caractères Microsoft (Microsoft OCR)
- Microsoft Project Oxford Online OCR
- Microsoft Azure ComputerVision OCR
- Tesseract OCR
- Google Cloud Vision OCR
- Texte OCR existant (OCR Text Exists)
- Cliquer sur l'image (Click Image)
- Pointer sur l'image (Hover Image)
- Rechercher les correspondances de l'image (Find Image Matches)
- Image existante (Image Exists)
- Rechercher l'image (Find Image)
- Attendre que l'image disparaisse (Wait Image Vanish)
- Sur apparition de l'image (On Image Appear)
- Sur disparition de l'image (On Image Vanish)
- Charger l'image (Load Image)
- Enregistrer l'image (Save Image)
- Lier à un navigateur (Attach Browser)
- Fermer l'onglet (Close Tab)
- Revenir en arrière (Go Back)
- Avancer (Go Forward)
- Accéder à l'accueil (Go Home)
- Injecter JavaScript (Inject JS Script)
- Accéder à (Navigate To)
- Ouvrir le navigateur (Open Browser)
- Actualiser le navigateur (Refresh Browser)
- Définir l'attribut Web (Set Web Attribute)
- Lier à une fenêtre (Attach Window)
- Fermer la fenêtre (Close Window)
- Obtenir la fenêtre active (Get Active Window)
- Masquer la fenêtre (Hide Window)
- Agrandir la fenêtre (Maximize Window)
- Réduire la fenêtre (Minimize Window)
- Déplacer la fenêtre (Move Window)
- Restaurer la fenêtre (Restore Window)
- Afficher la fenêtre (Show Window)
- Export UI Tree
- Invoquer la méthode ActiveX
- Injecter du code .NET
- Déclencheur de clic (Click Trigger)
- Déclencheur de pression de touche (Key Press Trigger)
- Déclencheur de clic image (Click Image Trigger)
- Déclencheur système (System Trigger)
- Déclencheur de raccourci (Hotkey Trigger)
- Déclencheur de souris (Mouse Trigger)
- Obtenir les infos de l'événement (Get Event Info)
- Surveiller les événements (Monitor Events)
- Obtenir l'élément source (Get Source Element)
- Relire l'événement utilisateur (Replay User Event)
- Block User Input
- Utiliser le premier plan
- Element Attribute Change Trigger
- Element State Change Trigger
- Légende (Callout)
- Copier le texte sélectionné (Copy Selected Text)
- Récupérer du presse-papiers (Get From Clipboard)
- Placer dans le presse-papiers (Set To Clipboard)
- Fermer l'application (Close Application)
- Ouvrir l'application (Open Application)
- Déclencher le processus (Start Process)
- Récupérer le mot de passe (Get Password)
- Info-bulle
- Click Picture on Screen
- Click Toolbar Button
- Read Statusbar
- Select Dates In Calendar
- Select Menu Item
- Expand Tree
- Call Transaction
- SAP Logon
- SAP Login
- Table Cell Scope
- SAP Session Attributes Change Trigger
- Expand ALV Tree
- Expand ALV Hierarchical Table
- Use Application/Browser
- Check App State
- Check/Uncheck
- Cliquer (Click)
- Extract Table Data
- Obtenir le texte (Get Text)
- Get URL
- Go To URL
- Mettre en surbrillance (Highlight)
- Pointer (Hover)
- Raccourcis clavier
- Navigate Browser
- Sélectionner l'élément (Select Item)
- Prendre une capture d'écran (Take Screenshot)
- Saisir dans (Type Into)
- Obtenir l'attribut (Get Attribute)
- Get Browser Data
- Set Browser Data
- Mouse scroll
- Inject Js Script
- Glisser et déposer
- For Each UiElement
- Application event trigger
- Click Event Trigger
- Keypress Event Trigger
- Définir le texte (Set Text)
- Check Element
- Remplir le formulaire
- Joindre
- Vérifier (Check)
- Cliquer (Click)
- Glisser et déposer
- Extraire des données
- Obtenir l'attribut (Get Attribute)
- ObtenirEnfants
- ObtenirCibleRuntime
- GetText
- Get URL
- GoToUrl
- Mettre en surbrillance (Highlight)
- Pointer (Hover)
- Activé
- Raccourci clavier
- Mouse scroll
- Ouvrir
- Sélectionner l'élément (Select Item)
- Prendre une capture d'écran (Take Screenshot)
- Saisir dans (Type Into)
- ÉtatAttente
- Effectuez une recherche par navigateur et récupérez les résultats à l'aide des API UI Automation
- Navigation sur le Web
- Rechercher des images
- Cliquer sur des images
- Déclencher et surveiller des événements
- Créer et remplacer des fichiers
- Pages HTML : extraire et manipuler des informations
- Manipulation des fenêtres
- Sélection de liste automatisée
- Rechercher et manipuler des éléments de fenêtre
- Gérer l'automatisation du texte
- Charger et traiter des images
- Gérer les actions activées par la souris
- Automatiser l'exécution des applications
- Exécution automatisée d'une application locale
- Navigation avec le navigateur
- Automatisation Web
- Exemple de fonctionnalités du déclencheur
- Computer Vision Local Server
- Automatisation mobile
- Notes de publication
- Compatibilité du projet
- Get Log Types
- Get Logs
- Get Page Source
- Get Device Orientation
- Get Session Identifier
- Installer l'application
- Gérer l'application actuelle
- Gérer une autre application
- Ouvrir DeepLink
- Ouvrir l'URL
- Mobile Device Connection
- Positional Swipe
- Press Hardware Button
- Set Device Orientation
- Prendre une capture d'écran (Take Screenshot)
- Prendre une partie de capture d'écran
- Élément existant (Element Exists)
- Execute Command
- Obtenir l'attribut (Get Attribute)
- Get Selected Item
- Obtenir le texte (Get Text)
- Set Selected Item
- Définir le texte (Set Text)
- Balayer
- Tap
- Saisir texte
- Dessiner un modèle
- Terminal
- Notes de publication
- À propos du package d'activités Terminal
- Compatibilité du projet
- Session de terminal (Terminal Session)
- Accéder à la zone d'écran (Get Screen Area)
- Obtenir le texte en position (Get Text at Position)
- Get Color At Position
- Obtenir le champ en position (Get Field at Position)
- Définir le champ en position (Set Field at Position)
- Attendre le texte en position (Wait Text at Position)
- Envoyer les touches (Send Keys)
- Déplacer le curseur (Move Cursor)
- Envoyer les touches en toute sécurité (Send Keys Secure)
- Obtenir le texte (Get Text)
- Rechercher un texte (Find Text)
- Move Cursor to Text
- Envoyer la touche Contrôle (Send Control Key)
- Obtenir le champ (Get Field)
- Attendre le texte d'écran (Wait Screen Text)
- Attendre le texte de champ (Wait Field Text)
- Définir le champ (Set Field)
Injecter du code .NET
UiPath.Core.Activities.InjectDotNetCode
Injecte le code .NET dans le thread d'interface utilisateur principal de l'application cible. Destiné à être utilisé avec les applications d'interface utilisateur .NET qui n'exposent pas les technologies d'automatisation traditionnelles ou ne peuvent pas être correctement ciblées par des moyens traditionnels.
Commun
-
Poursuite sur erreur (ContinueOnError) - Spécifie si l'automatisation doit continuer même si l'activité génère un message d'erreur. Ce champ prend uniquement en charge les valeurs booléennes (True, False). La valeur par défaut est False. Par conséquent, si le champ est vide et si une erreur est renvoyée, l'exécution du projet s'interrompt. Si la valeur est configurée sur True, l'exécution du projet continue indépendamment de toute erreur.
Remarque : si cette activité est incluse dans l'activité Try Catch et que la valeur de la propriété ContinuerSurErreur est « True », aucune erreur ne sera détectée lors de l'exécution du projet. - NomAffichage (DisplayName) - Nom affiché de l'activité.
Entrée
- Assembly : chemin d'accès complet à l'assembly .NET compilé que vous souhaitez injecter. Ce champ prend uniquement en charge les chaînes et les variables
String
. -
Nom de la méthode : le nom de la méthode que vous voulez appeler. Seules les méthodes statiques publiques sont prises en charge.
Remarque : un type ne peut pas contenir plusieurs méthodes portant le même nom. Si tel est le cas, une erreur est renvoyée au moment de l'exécution. - Target.ClippingRegion : définit le rectangle de détourage, en pixels, par rapport à l'objet UiElement, dans les sens suivants : gauche, haut, droite, bas. Elle prend en charge les nombres positifs et négatifs.
- Élément cible (Target.Element) - Utiliser la variable UiElement renvoyée par une autre activité. Cette propriété ne peut pas être utilisée avec la propriété Selector. Ce champ prend en charge les variables UiElement uniquement.
- Sélecteur de cible (Target.Selector) - Propriété de texte utilisée pour trouver un élément donné de l'interface utilisateur lors de l'exécution de l'activité. Il s'agit en fait d'un fragment XML spécifiant les attributs de l'élément d'interface graphique utilisateur que vous recherchez et de certains de ses parents.
- Target.TimeoutMS - Spécifie la durée (en millisecondes) à attendre pour que l'activité s'exécute avant que l'erreur
SelectorNotFoundException
ne soit renvoyée. La valeur par défaut est de 30 000 millisecondes (30 secondes). -
Attente cible prête (Target.WaitForReady) - Avant d'exécuter les actions, attendez que la cible soit prête. Les options suivantes sont disponibles :
- None (Aucun) - Attend uniquement la création de l'élément de l'interface utilisateur cible avant d'exécuter l'action. Vous pouvez, par exemple, utiliser cette option si vous souhaitez récupérer uniquement du texte à partir d'une page Web ou cliquer sur un bouton spécifique sans être obligé d'attendre que tous les éléments de l'interface utilisateur soient chargés. Il est à noter que ceci peut avoir des conséquences indésirables si le bouton est basé sur des éléments qui ne sont pas encore chargés, comme par exemple des scripts.
-
Interactif/Terminé - Attend que tous les éléments d'IU de l'application cible soient créés avant d'exécuter l'action.
Pour évaluer si une application est à l'état Interactif (Interactive) ou Terminé (Complete), les balises suivantes sont vérifiées :
- Applications de bureau : un message
wm_null
est envoyé pour vérifier l'existence des balises<wnd>
,<ctrl>
,<java>
ou<uia>
. S'ils existent, l'activité est exécutée. - Applications Web (Web Applications)
- Internet Explorer : la balise
<webctrl>
est utilisée pour vérifier si l’état Prêt du document HTML est défini sur Terminé. En outre, l'état Occupé doit être défini sur « False ». - Autres : la balise
<webctrl>
est utilisée pour vérifier si l’état Prêt du document HTML est défini sur Terminé.
- Applications SAP (SAP applications) : une fois la présence de la balise
<wnd>
vérifiée, une API SAP spécifique est utilisée pour détecter si la session est occupée ou non.
- NomType : le nom de la classe publique qui contient la méthode d'exécution. Ce champ prend uniquement en charge les chaînes et les variables
String
.
Divers
- Privé (Private) - Si cette option est sélectionnée, les valeurs des variables et des arguments ne sont plus enregistrées au niveau Détaillé (Verbose).
Sortie
- Résultat : le résultat de la méthode invoquée, stocké dans une variable
Object
. Ce champ prend uniquement en charge les variablesObject
.
L'activité Injecter le code .NET ( Inject .NET Code) injecte le code uniquement dans l'élément AppDomain par défaut.
Certaines applications sont structurés de manière à ce que les éléments que vous devrez peut-être accéder ou manipuler ne sont pas situés dans l'AppDomain par défaut, de sorte qu'il ne suffit pas d'injecter du code dans l'AppDomain par défaut. Ainsi, si les éléments d'IU que vous souhaitez indiquer sont situés dans un autre AppDomain, ils ne sont pas disponibles pour le code injecté.
Pour résoudre ce problème, vous devez modifier le processus d'injection pour cibler l'AppDomain précis contenant les éléments de l'interface utilisateur. Plus exactement, vous devez injecter le code de la fonction exécutée dans l'AppDomain par défaut dans tous les AppDomains non-par défaut ou dans l'AppDomain spécifique non par défaut contenant les éléments d'IU que vous souhaitez indiquer.
MarshalByRefObject
, contenant la fonction que vous souhaitez exécuter dans des domaines d'application non par défaut :public class CrossAppDomainRunner : MarshalByRefObject
{
public void Execute(IntPtr controlHandle)
{
// Implementation of the method that will be executed in the target AppDomain
Trace.WriteLine("Sunt in " + AppDomain.CurrentDomain.FriendlyName);
Control foundControl = null;
try
{
foundControl = Control.FromHandle(controlHandle);
}
catch (Exception controlException)
{
int lastWin32Error = Marshal.GetLastWin32Error();
Trace.WriteLine($"+++++ An exception occurred while getting the control from handle {controlHandle}. The message is: {controlException.Message}, Win32 Error: {lastWin32Error}");
}
if (foundControl != null)
{
Trace.WriteLine($"+++++ Found control {foundControl.Name} from handle {controlHandle}");
}
else
{
int lastWin32Error = Marshal.GetLastWin32Error();
Trace.WriteLine($"+++++ Control NOT found based on handle {controlHandle}, Win32 Error: {lastWin32Error}");
}
}
}
public class CrossAppDomainRunner : MarshalByRefObject
{
public void Execute(IntPtr controlHandle)
{
// Implementation of the method that will be executed in the target AppDomain
Trace.WriteLine("Sunt in " + AppDomain.CurrentDomain.FriendlyName);
Control foundControl = null;
try
{
foundControl = Control.FromHandle(controlHandle);
}
catch (Exception controlException)
{
int lastWin32Error = Marshal.GetLastWin32Error();
Trace.WriteLine($"+++++ An exception occurred while getting the control from handle {controlHandle}. The message is: {controlException.Message}, Win32 Error: {lastWin32Error}");
}
if (foundControl != null)
{
Trace.WriteLine($"+++++ Found control {foundControl.Name} from handle {controlHandle}");
}
else
{
int lastWin32Error = Marshal.GetLastWin32Error();
Trace.WriteLine($"+++++ Control NOT found based on handle {controlHandle}, Win32 Error: {lastWin32Error}");
}
}
}
Execute
qui reçoit un paramètre IntPtr
. Ce paramètre contient la valeur de la commande que vous essayez de trouver. Dans cet exemple, vous devez transmettre uniquement un paramètre IntPtr
, mais dans votre situation particulière, vous pouvez ajouter autant de paramètres que vous le souhaitez.
ICorRuntimeHost
de mscoree
. Pour ce faire, vous devez déclarer cette interface :
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.InteropServices;
namespace mscoree
{
[CompilerGenerated]
[Guid("CB2F6722-AB3A-11D2-9C40-00C04FA30A3E")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[TypeIdentifier]
[ComImport]
[CLSCompliant(false)]
public interface ICorRuntimeHost
{
void _VtblGap1_11();
void EnumDomains(out IntPtr enumHandle);
void NextDomain([In] IntPtr enumHandle, [MarshalAs(UnmanagedType.IUnknown)] out object appDomain);
void CloseEnum([In] IntPtr enumHandle);
}
}
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.InteropServices;
namespace mscoree
{
[CompilerGenerated]
[Guid("CB2F6722-AB3A-11D2-9C40-00C04FA30A3E")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[TypeIdentifier]
[ComImport]
[CLSCompliant(false)]
public interface ICorRuntimeHost
{
void _VtblGap1_11();
void EnumDomains(out IntPtr enumHandle);
void NextDomain([In] IntPtr enumHandle, [MarshalAs(UnmanagedType.IUnknown)] out object appDomain);
void CloseEnum([In] IntPtr enumHandle);
}
}
Vous devez déclarer une classe contenant des méthodes natives pour initialiser le modèle d'objet de composant (COM) :
public static class NativeMethods
{
[DllImport("ole32.dll")]
public static extern int CoInitializeEx(IntPtr pvReserved, COINIT dwCoInit);
public enum COINIT : uint
{
/// Initializes the thread for multi-threaded object concurrency.
COINIT_MULTITHREADED = 0x0,
/// Initializes the thread for apartment-threaded object concurrency.
COINIT_APARTMENTTHREADED = 0x2,
// ...
}
}
public static class NativeMethods
{
[DllImport("ole32.dll")]
public static extern int CoInitializeEx(IntPtr pvReserved, COINIT dwCoInit);
public enum COINIT : uint
{
/// Initializes the thread for multi-threaded object concurrency.
COINIT_MULTITHREADED = 0x0,
/// Initializes the thread for apartment-threaded object concurrency.
COINIT_APARTMENTTHREADED = 0x2,
// ...
}
}
ICorRunttimeHost
:
public static ICorRuntimeHost GetCorRuntimeHost()
{
return (ICorRuntimeHost)Activator.CreateInstance(Marshal.GetTypeFromCLSID(new Guid("CB2F6723-AB3A-11D2-9C40-00C04FA30A3E")));
}
public static ICorRuntimeHost GetCorRuntimeHost()
{
return (ICorRuntimeHost)Activator.CreateInstance(Marshal.GetTypeFromCLSID(new Guid("CB2F6723-AB3A-11D2-9C40-00C04FA30A3E")));
}
GetControlData
est exécutée par l'activité Injecter du code .NET (Inject .NET Code) dans l'élément AppDomain par défaut :
public static void GetControlData(Int64 controlHandle, out string response)
{
//initialising COM
NativeMethods.CoInitializeEx(IntPtr.Zero, NativeMethods.COINIT.COINIT_MULTITHREADED);
mscoree.ICorRuntimeHost host = null;
try
{
host = (ICorRuntimeHost)Activator.CreateInstance(Marshal.GetTypeFromCLSID(new Guid("CB2F6723-AB3A-11D2-9C40-00C04FA30A3E")));
}
catch (COMException comEx)
{
Trace.WriteLine($"COMException: {comEx.Message}, HRESULT: {comEx.ErrorCode}");
}
catch (Exception ex)
{
// Handle other exceptions
Trace.WriteLine($"Exception: {ex.Message}");
}
IntPtr enumHandle = IntPtr.Zero;
try
{
//now that we have ICorRuntimeHost object we can use it to enumerate the other domains
host.EnumDomains(out enumHandle);
object domain = null;
host.NextDomain(enumHandle, out domain);
while (domain != null)
{
//for each appdomain obtained
AppDomain appDomain = (AppDomain)domain;
//appDomain.BaseDirectory; - you might want to copy your dll
//in the appDomain.BaseDirectory cause otherwise it might not find
//the assembly
ObjectHandle handle = appDomain.CreateInstance(
typeof(CrossAppDomainRunner).Assembly.FullName,
typeof(CrossAppDomainRunner).FullName);
// Unwrap to get the actual object
var runnerProxy = handle.Unwrap();
// Use reflection to call the Execute method
MethodInfo executeMethod = runnerProxy.GetType().GetMethod("Execute", new Type[] { typeof(IntPtr) });
//pass parameters as new object[]
executeMethod.Invoke(runnerProxy, new object[] { new IntPtr(controlHandle) });
//go to next appdomain
host.NextDomain(enumHandle, out domain);
if (domain == null)
break;
}
}
finally
{
if (host != null)
{
if (enumHandle != IntPtr.Zero)
{
host.CloseEnum(enumHandle);
}
Marshal.ReleaseComObject(host);
}
}
response = string.Empty;
}
public static void GetControlData(Int64 controlHandle, out string response)
{
//initialising COM
NativeMethods.CoInitializeEx(IntPtr.Zero, NativeMethods.COINIT.COINIT_MULTITHREADED);
mscoree.ICorRuntimeHost host = null;
try
{
host = (ICorRuntimeHost)Activator.CreateInstance(Marshal.GetTypeFromCLSID(new Guid("CB2F6723-AB3A-11D2-9C40-00C04FA30A3E")));
}
catch (COMException comEx)
{
Trace.WriteLine($"COMException: {comEx.Message}, HRESULT: {comEx.ErrorCode}");
}
catch (Exception ex)
{
// Handle other exceptions
Trace.WriteLine($"Exception: {ex.Message}");
}
IntPtr enumHandle = IntPtr.Zero;
try
{
//now that we have ICorRuntimeHost object we can use it to enumerate the other domains
host.EnumDomains(out enumHandle);
object domain = null;
host.NextDomain(enumHandle, out domain);
while (domain != null)
{
//for each appdomain obtained
AppDomain appDomain = (AppDomain)domain;
//appDomain.BaseDirectory; - you might want to copy your dll
//in the appDomain.BaseDirectory cause otherwise it might not find
//the assembly
ObjectHandle handle = appDomain.CreateInstance(
typeof(CrossAppDomainRunner).Assembly.FullName,
typeof(CrossAppDomainRunner).FullName);
// Unwrap to get the actual object
var runnerProxy = handle.Unwrap();
// Use reflection to call the Execute method
MethodInfo executeMethod = runnerProxy.GetType().GetMethod("Execute", new Type[] { typeof(IntPtr) });
//pass parameters as new object[]
executeMethod.Invoke(runnerProxy, new object[] { new IntPtr(controlHandle) });
//go to next appdomain
host.NextDomain(enumHandle, out domain);
if (domain == null)
break;
}
}
finally
{
if (host != null)
{
if (enumHandle != IntPtr.Zero)
{
host.CloseEnum(enumHandle);
}
Marshal.ReleaseComObject(host);
}
}
response = string.Empty;
}
L'exemple ci-dessus injecte le code dans tous les AppDomains. Une fois que vous avez trouvé l'AppDomain où se trouvent les éléments d'IU que vous souhaitez indiquer, vous pouvez énumérer tous les AppDomains, mais injecter le code uniquement dans l'AppDomain nécessaire.